/**
*****************************************************************************
 * @file func_StepMotor.h
 * @brief 步进电机功能函数
 * @author Moon
 * @version V1.0.0
 * @date 2022/09/04
****************************************************************************
 */
#ifndef _FUNC_STEPMOTOR_H
#define _FUNC_STEPMOTOR_H

#include <stdint.h>

typedef struct func_StepMotor func_StepMotor_t;
/* 电机各参数转换公式 -----------------------------------------------*/
#define rpm_turn_speed(step_motor, rpm) \
    (float)(step_motor->unit_travel * rpm / 60)     //转速 转 速度  mm/s = lead(每圈移动多少mm) * (r/min/60=r/s)

#define speed_turn_rpm(step_motor, speed) \
    (float)(60 * speed / step_motor->unit_travel)   //速度 转 转速  rpm = (60*mm/s=r/min) /lead =r/rpm

#define speed_turn_freq(step_motor, speed)   \
    (uint32_t)(step_motor->subdivide *       \
               step_motor->stepangle *       \
               step_motor->reduction_ratio * \
               speed / step_motor->unit_travel)     //  速度 转 脉冲 (mm/s / lead = r/s)  * subdivide  *  reduction_ratio = Hz

#define rpm_turn_freq(step_motor, rpm)       \
    (uint32_t)(step_motor->subdivide *       \
               step_motor->stepangle *       \
               step_motor->reduction_ratio * \
               rpm / 60)                            //  速度 转 脉冲     (mm/s / lead = r/s)  * subdivide  *  reduction_ratio = Hz

#define distance_turn_pluse(step_motor, distance) \
    (float)(distance /                            \
            step_motor->unit_travel *             \
            step_motor->subdivide *               \
            step_motor->stepangle *               \
            step_motor->reduction_ratio)            //  距离 转 脉冲     (mm / lead = r)*subdivide*reduction_ratio = pluse

#define pluse_turn_distance(step_motor, pluse) \
    (float)((float)pluse /                     \
            step_motor->subdivide /            \
            step_motor->stepangle /            \
            step_motor->reduction_ratio *      \
            step_motor->unit_travel)                //  脉冲 转 距离
/* Private enum ---------------------------------------------------------------*/
typedef enum
{
    REVERSE_LIMITE = 0,     //反转限位（起始点）
    FORWARD_LIMITE , //正转限位（满量程）
   
    LIMITE_NMU,
} LIMITE_e;

typedef enum //转向
{
    Motor_Forward = 1, //正转
    Motor_Reverse = 2  //反转
} MotorTrunDif_t;

typedef enum //模式
{
    STEP_NO_FEEDBACK_RUN = 0,    //不带反馈的运行  常态
    STEP_FEEDBACK_RUN = 1,       //带反馈的运行    常态    
    STEP_MANUAL_RUN = 2,         //手动模式        非常态
    STEP_AUTO_BACK_ZERO_RUN = 3, //自动返回零点    非常态
    STEP_AUTO_CRICLE_RUN = 4,    //自动循环运行    非常态
} STEP_MotorWorkModeDif_t;

typedef enum //电机当前状态
{
	STEP_MOTOR_STOP = 0,			//电机停止状态或就绪状态
	STEP_MOTOR_RUN = 1,			 	//电机运行中 排除电机未运行完就再次设置运行
	STEP_MOTOR_FORWARD_LIMIT = 3, 	//电机正转限位 满量程限位
	STEP_MOTOR_REVERSE_LIMIT = 4, 	//电机反转限位 零点限位
	STEP_MOTOR_FAULT = 6,		 	//电机驱动异常
} STEP_MotorWorkStatusDif_t;

typedef enum //运动单位
{
    RUN_M = 1,      //米
    RUN_CM = 2,     //厘米
    RUN_MM = 3,     //毫米
    RUN_UM = 4,     //微米
    RUN_NM = 5,     //纳米
    RUN_PULSE = 6,  //脉冲
    RUN_ANGLE = 7,  //角度
    RUN_GRAD = 8    //分度
} STEP_RUN_UNIT_e;

typedef struct //PWM控制主从定时器参数
{
	uint32_t speed; //主定时器频率
	uint32_t cnt; 	//从定时器比较值
} MotorTimePar_Struct;

typedef enum //运动模式定义
{
	UNIFORM_SPORT = 1,	   //匀速
	S_ACCELERATE_SPORT = 2 // S型加减速
} SportModeDif_t;

#define ACC_CURVE_MAX_NUMBER           (300)   //加速数组最大值  加速次数
#define REDUCE_CURVE_MAX_NUMBER        (300)   //加速数组最大值  加速次数
#define UNIFORM_CURVE_MAX_NUMBER       (50)   //匀速数组最大值   匀速次数

typedef struct //电机加减速结构体
{
	uint8_t sport_type;	  //电机运动类型  匀速运动和加减速运动
	uint8_t sport_status; //电机运动状态  加速过程  匀速过程  减速过程

	MotorTimePar_Struct ACC_Curve_List[ACC_CURVE_MAX_NUMBER];		  //生成的加速列表
	MotorTimePar_Struct Reduce_Curve_List[REDUCE_CURVE_MAX_NUMBER];	  //生成减速列表
	MotorTimePar_Struct Uniform_Curve_List[UNIFORM_CURVE_MAX_NUMBER]; //生成的匀速列表

	uint32_t Uniform_Curve_Sum; //匀速脉冲数

	float ACC_flexible;		//S型加速曲线系数，一般4-6之间
	float ACC_start_speed;	//S型加速起始速度，单位RPM（每分钟多少转）
	uint32_t ACC_Curve_Sum; //加速脉冲数

	float Reduce_flexible;	   // S型减速曲线系数，一般4-6之间
	float Reduce_end_speed;	   // S型减速起始速度，单位RPM（每分钟多少转）
	uint32_t Reduce_Curve_Sum; //减速脉冲数

	uint32_t curve_count; //当前已经执行的脉冲数
} MotorAccPar_Struct_t;


typedef struct
{
    STEP_MotorWorkStatusDif_t step_status; //电机工作状态
    uint8_t step_rezero_status;            //电机回零指示

    MotorAccPar_Struct_t MotorAcc;         //运动控制

    float position_tar;           //目标绝对位置
    float position_cur;           //当前绝对位置
    float rel_position_tar;       //目标相对位置
    int32_t pulse_tar;            //目标绝对脉冲
    int32_t pulse_cur;            //当前绝对脉冲
    uint32_t rel_pulse_tar;       //目标相对脉冲
    uint32_t rel_detec_pulse_tar; //目标相对脉冲
} FunStepMotor_private_t;
/* Private Struct ---------------------------------------------------------------*/
struct func_StepMotor 					//步进电机运动控制结构体  行程控制相关
{
	/* ***************Public Parameter  *************** */
	STEP_MotorWorkModeDif_t 	step_workmode;		   		     //电机工作模式
	
	float unit_travel; 		                                     //丝杆导程(电机转一圈的距离)
	float reduction_ratio; 	                                     //减速比
	uint16_t stepangle;		                                     //步距角 200(一般两相步进电机步距角为1.8度，即1细分下，步进电机转过360度，共需360/1.8 = 200个脉冲)
	uint16_t subdivide;                                          //细分    驱动芯片细分
	MotorTrunDif_t dir;			                                 //方向 正反转
	float speed;		   	                                     //速度 单位RPM 每分钟多少转
    float uniform_speed;                                         //速度 单位RPM 每分钟多少转(电机匀速转速)
    uint32_t scan_cnt;	                                         //单次扫描次数，用于解决在匀速运行时，从定时器最大只有65535，增加最大脉冲控制脉冲
    uint8_t limit_polarity;                                      //限位极性（0：低电平触发，1：高电平触发）

	void (*res_set_step_dir)(uint8_t dir);						 //注册设置转向
	int (*res_get_fault)(void);									 //注册获取电机故障状态（0：正常）

	int	(*res_set_step_run)(uint32_t speed, uint32_t pluse);	 //注册设置电机运动
	void (*res_set_run_control)(uint8_t control);				 //注册开启/关闭电机

    uint8_t (*res_limit_io)(LIMITE_e limit);				     //注册限位电平读取
	/* ***************Public Method     *************** */
	void (*StepMotor_MoveJerk)(func_StepMotor_t *);                //电机急停
	void (*StepMotor_Set_Speed)(func_StepMotor_t *, float speed);  //设置速度
	void (*StepMotor_Set_reduction_ratio)(func_StepMotor_t *,      //设置电机减速比
										  float reduction_ratio);           
	void (*StepMotor_Set_Screw_Lead)(func_StepMotor_t *,           //设置丝杆导程
									 float lead);

    int (*set_step_dir)(func_StepMotor_t *, MotorTrunDif_t dir);  //设置转向
    
    STEP_MotorWorkStatusDif_t (*get_status)(func_StepMotor_t *);  //获取当前工作状态
	
	int (*StepMotor_Run)(func_StepMotor_t *,        // 无极运行，正转和反转
                         MotorTrunDif_t dir);
	int (*StepMotor_Stop)(func_StepMotor_t * );       // 停止
                  
	
    int (*StepMotor_Set_Position_unit)(func_StepMotor_t *,        //带单位运动
                                       uint8_t type,
                                       float distance,
                                       STEP_RUN_UNIT_e unit);
    void (*runover_callback)(func_StepMotor_t *this);                //动作结束回调
    void (*limit_callback)(func_StepMotor_t *this, LIMITE_e limit);  //限位触发回调
    /* ***************Private Attributes*************** */
    FunStepMotor_private_t private;	
};
/* Public enum -----------------------------------------------------------*/

/* Public Variable ---------------------------------------------------------*/
//Pointer
//Array
//Const
/* Pubilc function prototypes -----------------------------------------------*/
int Func_StepMotor_Init(func_StepMotor_t *this);

#endif
